home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 20
/
Cream of the Crop 20 (Terry Blount) (1996).iso
/
program
/
3dview12.zip
/
VESAASM.ASM
< prev
next >
Wrap
Assembly Source File
|
1996-05-30
|
39KB
|
1,864 lines
.data
; ##### VESAOffs is a table of Lineoffset values.
; ##### For example VESAOffs[100] is the Offset of Screenline 100.
; ##### With VESAOffs there are much less IMULs.
EXTRN _VESA_OFSTable:DWORD
EXTRN _VESA_MinX:DWORD
EXTRN _VESA_MaxX:DWORD
EXTRN _VESA_MinY:DWORD
EXTRN _VESA_MaxY:DWORD
EXTRN _VESA_BpL:DWORD
EXTRN _VESA_ScreenSize_Byte:DWORD
EXTRN _VESA_Selector:WORD
VESAOffs EQU _VESA_OFSTable
VESAMinX EQU _VESA_MinX
VESAMinY EQU _VESA_MinY
VESAMaxX EQU _VESA_MaxX
VESAMaxY EQU _VESA_MaxY
VESABpL EQU _VESA_BpL
VESAScrSize EQU _VESA_ScreenSize_Byte
VESASel EQU _VESA_Selector
CODE SEGMENT PUBLIC DWORD USE32
ASSUME CS:CODE,FS:CODE
PUBLIC VESA_Line8B
PUBLIC VESA_HLine8B
PUBLIC VESA_HLineG8B
PUBLIC VESA_HLineG8BFast
PUBLIC VESA_HLineTex8B
PUBLIC VESA_HLineTex8BFast
PUBLIC VESA_HLineZ8B
PUBLIC VESA_HLineGZ8B
PUBLIC VESA_HLineTexZ8B
PUBLIC VESA_FilledTriangle8B
PUBLIC VESA_FilledTriangleG8B
PUBLIC VESA_SetColor8B
PUBLIC VESA_GetCodeAlias
PUBLIC VESA_CopyScreen8B
PUBLIC VESA_ClearScreen8B
PUBLIC VESA_SetClipArea
PUBLIC VESA_SyncDisplay
PUBLIC VESA_SetDisplayStart
PUBLIC VESA_ClearZBuffer
; ###### Assume FS=CODE for Selfmodification.
; ###### Without this you get Compiler-Warnings.
ASSUME FS:CODE
CodeAlias DW ?
VESA_SetDisplayStart PROC PASCAL X:WORD,Y:WORD
; ##### After calling this PROC the Graphic Adapter starts
; ##### scanning the Video-Memory from Row Y and Column X.
MOV AX,04f07h
MOV BL,80h
MOV BH,0
MOV CX,X
MOV DX,Y
INT 10h
RET
VESA_SetDisplayStart ENDP
VESA_SyncDisplay PROC PASCAL
; ##### Waits for Vertical Retrace
; ##### Maybe needed for 'no-flicker'.
MOV DX,03DAh
sd_Wait0:
IN AL,DX
TEST AL,08h
JNZ sd_Wait0
sd_Wait1:
IN AL,DX
TEST AL,08h
JZ sd_Wait1
RET
VESA_SyncDisplay ENDP
VESA_SetClipArea PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD
; ##### Changes the VESAMin- and VESAMax-Values.
; ##### Fast routines can plug these Values directly
; ##### in their code. This is much faster then
; ##### CMPring to memory values.
; ##### CodeAlias needed for Code Segment
; ##### writes.
MOV FS,CS:CodeAlias
MOV EAX,X1
MOV VESAMinX,EAX
MOV FS:Li8B_XCMPMinX,EAX
MOV FS:Li8B_YCMPMinX,EAX
MOV FS:HLi8BR_X2CMPMinX,EAX
MOV FS:HLi8BR_X1CMPMinX,EAX
MOV FS:HLi8BR_MOVMinX,EAX
MOV FS:HLiG8B_CMPMinX,EAX
MOV FS:HLiG8B_CMPMinX2,EAX
MOV FS:HLiG8B_SUBMinX,EAX
MOV FS:HLiG8B_MOVMinX,EAX
MOV EAX,Y1
MOV VESAMinY,EAX
MOV FS:Li8B_XCMPMinY,EAX
MOV FS:Li8B_YCMPMinY,EAX
MOV FS:HLi8BR_CMPMinY,EAX
MOV FS:HLiG8B_CMPMinY,EAX
MOV EAX,X2
MOV VESAMaxX,EAX
MOV FS:Li8B_XCMPMaxX,EAX
MOV FS:Li8B_YCMPMaxX,EAX
MOV FS:HLi8BR_X2CMPMaxX,EAX
MOV FS:HLi8BR_X1CMPMaxX,EAX
MOV FS:HLi8BR_MOVMaxX,EAX
MOV FS:HLiG8B_CMPMaxX,EAX
MOV FS:HLiG8B_CMPMaxX2,EAX
MOV FS:HLiG8B_MOVMaxX,EAX
MOV EAX,Y2
MOV VESAMaxY,EAX
MOV FS:Li8B_XCMPMaxY,EAX
MOV FS:Li8B_YCMPMaxY,EAX
MOV FS:HLi8BR_CMPMaxY,EAX
MOV FS:HLiG8B_CMPMaxY,EAX
RET
VESA_SetClipArea ENDP
VESA_SetColor8B PROC PASCAL NR:WORD,R:WORD,G:WORD,B:WORD
; ##### Sets the Palette Entry for Color NR.
; ##### Red,Green and Blue Values from 0 to 255.
MOV BL,BYTE PTR NR
MOV BH,0
MOV DH,BYTE PTR R
SHR DH,2
MOV CH,BYTE PTR G
SHR CH,2
MOV CL,BYTE PTR B
SHR CL,2
MOV AX,1010h
INT 10h
RET
VESA_SetColor8B ENDP
VESA_ClearScreen8B PROC PASCAL CO:DWORD,S:WORD
; ##### Clears the Screen 'S' in all 256-Color-Modes.
; ##### Fills the Screen with Color CO.
; ##### Uses fast DWORD STOS.
; ##### The number of bytes cleared are taken from
; ##### VESAScrSize=VESABpL*YResolution of the
; ##### current Video Mode.
MOV ECX,VESAScrSize
MOV EBX,ECX
AND EBX,11b
SHR ECX,2
MOV ES,S
XOR EDI,EDI
MOV EAX,CO
CLD
REP STOS DWORD ES:[EDI]
MOV ECX,EBX
REP STOS BYTE ES:[EDI]
RET
VESA_ClearScreen8B ENDP
VESA_CopyScreen8B PROC PASCAL S:WORD,D:WORD
; ##### Copies the Screen 'S' to the Screen 'D' in all
; ##### 256-Color-Modes.
; ##### Uses fast DWORD MOVS.
; ##### The number of bytes copied are taken from
; ##### VESAScrSize=VESABpL*YResolution of the
; ##### current Video Mode.
MOV ECX,VESAScrSize
MOV EBX,ECX
AND EBX,11b
SHR ECX,2
MOV FS,S
XOR ESI,ESI
MOV ES,D
XOR EDI,EDI
CLD
REP MOVS DWORD ES:[EDI],FS:[ESI]
MOV ECX,EBX
REP MOVS BYTE ES:[EDI],FS:[ESI]
RET
VESA_CopyScreen8B ENDP
VESA_GetCodeAlias PROC PASCAL
; ##### Because writing to Code Segment causes a protection fault,
; ##### we have to create a Code Alias Selector, to which we can
; ##### write. This is done by DPMI Function 000ah.
MOV AX,0000ah
MOV BX,CS
INT 031h
MOV FS,AX
MOV FS:CodeAlias,AX
RET
VESA_GetCodeAlias ENDP
VESA_Line8B PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD,C:DWORD,S:WORD
; #####
; ##### Line8B draws a Line from (X1,Y1) to (X2,Y2) in all
; ##### 256-Color-Modes. C is used as color and S as the
; ##### Screenselector.
; #####
; ##### FS = CodeAlias for Self-Modification
; ##### GS = Selector of Screen
MOV FS,CS:CodeAlias
MOV GS,S
; ##### ECX = X2-X1
; ##### EAX = ABS( ECX )
; ##### AddX = ( X2-X1 > 0 ? 1 : -1 )
MOV EAX,X2
SUB EAX,X1
MOV ECX,EAX
MOV DWORD FS:Li8B_AddX,1
JNS Li8B_DXPos
MOV DWORD FS:Li8B_AddX,-1
NEG EAX
Li8B_DXPos:
; ##### EDX = Y2-Y1
; ##### EBX = ABS( EDX )
; ##### AddY = ( Y2-Y1 > 0 ? 1 : -1 )
MOV EBX,Y2
SUB EBX,Y1
MOV EDX,EBX
MOV DWORD FS:Li8B_AddY,1
JNS Li8B_DYPos
MOV DWORD FS:Li8B_AddY,-1
NEG EBX
Li8B_DYPos:
; ##### Walk along X-Axis or Y-Axis ?
CMP EBX,EAX
JLE Li8B_ADXBigger
; ##### Calculate M = (X2-X1)/ABS(Y2-Y1) * 2^16
OR EBX,EBX
JZ Li8B_DYZero
MOV EAX,ECX
SHL EAX,16
CDQ
IDIV EBX
MOV FS:Li8B_YM,EAX
Li8B_DYZero:
; ##### ECX = Number of Pixs
; ##### EAX = Color
; ##### EDX = X1 * 2^16
; ##### EBX = Y1
MOV ECX,EBX
INC ECX
MOV EAX,C
MOV EDX,X1
SHL EDX,16
MOV EBX,Y1
Li8B_LoopY:
; ##### ESI = INT( X );
MOV ESI,EDX
SAR ESI,16
; ##### Clipping ...
; ##### The Clipping-Values are set by 'SetClipArea'
; ##### CMP ESI,YCMPMinX
DB 081h, 0feh
Li8B_YCMPMinX DD ?
JL Li8B_YNoPix
; ##### CMP ESI,YCMPMaxX
DB 081h, 0feh
Li8B_YCMPMaxX DD ?
JG Li8B_YNoPix
; ##### CMP EBX,YCMPMinY
DB 081h, 0fbh
Li8B_YCMPMinY DD ?
JL Li8B_YNoPix
; ##### CMP EBX,YCMPMaxY
DB 081h, 0fbh
Li8B_YCMPMaxY DD ?
JG Li8B_YNoPix
; ##### ' Pix( ESI, EBX, AL ) '
; ##### These two are the only memory references
; ##### in the LOOP. It should be fast.
MOV EDI,VESAOffs[EBX*4]
MOV GS:[EDI+ESI],AL
Li8B_YNoPix:
; ##### Calculate new X- and Y-Values and go on...
; ##### ADD EDX,M means 'ADD X,M'
DB 081h, 0c2h
Li8B_YM DD ?
; ##### ADD EBX,AddY means 'ADD Y,AddY'
DB 081h, 0c3h
Li8B_AddY DD ?
LOOP Li8B_LoopY
RET
Li8B_ADXBigger:
; ##### ECX = Number of Pixs
MOV ECX,EAX
INC ECX
; ##### Calculate M = (Y2-Y1)/ABS(X2-X1) * 2^16
OR EAX,EAX
JZ Li8B_DXZero